package br.uniceub.fsw.academicmobile.util;

import org.apache.commons.fileupload.*;
import java.util.*;
import java.io.*;
import javax.servlet.http.HttpServletRequest;

/**
 * Realiza o upload de arquivo a partir da lista de items multipart/form-data.
 * @author Christian Miranda.
 */
public class FileUploadUtil {

            
      /**
       * nome do arquivo
       */
      private String file;
      
      /**
       * entradas de tela
       */
      private Vector params;
      
      /**
       * nome e caminho do arquivo criado
       */
      private File arquivoCriado;
    
    
	/**
         * TODO alinhar com o administrador do servidor onde os arquivos 
         * deverão ser armazenados, estipular os formatos permitidos e seu
         * tamanho máximo.
	 * Caminho onde o arquivo sera salvo.
	 */
	private static String PATH = "C:/Users/Dejavu/Desktop/";

	/**
	 * Recebe a lista de items e grava o arquivo com o mesmo nome do recebido.
	 * @param items Lista de items multipart/form-data.
	 * @return String String com o caminho onde o arquivo foi salvo.
	 * @throws Exception
	 */
	public static String fazerUpload(List items)
			throws Exception {
		
		String retorno = "Nenhum arquivo foi carregado";

		try {

			Iterator itr = items.iterator();
			while (itr.hasNext()) {
				FileItem item = (FileItem) itr.next();
				if (!item.isFormField()) {
				    
				    File diretorio = new File(FileUploadUtil.PATH);
				    String nome = item.getName().substring(
				    		item.getName().lastIndexOf("\\")+ 1, item.getName().length());
				    File file = new File(diretorio+"\\", nome);
				    FileOutputStream fos = new FileOutputStream(file);
				    InputStream is = item.getInputStream();
				    byte[] buffer = new byte[2048];
				    int nLidos;
				    while ((nLidos = is.read(buffer)) >= 0) {
				    fos.write(buffer, 0, nLidos);
				    }
				    fos.flush();
				    fos.close();
				    System.out.println("Arquivo gravado em " + file.getAbsolutePath());
				    retorno =  file.getAbsolutePath().toString();
				}
			}
		} catch (Exception erro) {
			throw new Exception(erro.getMessage());
		}
		return retorno;
	}
	
	/**
	 * Exclui o arquivo a partir do caminho recebido.
	 * @param caminho caminho onde se encontra o arquivo.
	 * @return retorna true se o arquivo foi deletado com sucesso.
	 */
	public static boolean excluirArquivo(String caminho){
		
		File deletado = new File(caminho);
		System.out.println("Arquivo deletado - " + deletado.getAbsolutePath());
		return deletado.delete();
	}

        /**
	 * Recebe o request de tela e grava o arquivo com o mesmo nome do recebido.
	 * @param campo String com nomedo campo input onde está o arquivo
         * @param local onde o arquivo será salvo
         * @param request request de tela
	 * @return boolean true se o arquivo for incluido com sucesso
	 */
        public boolean fazerUpload(String campo, String local, HttpServletRequest request){
          try{
              File loc = new File(local);

              if(!loc.isDirectory())              
                  loc.mkdir();
              params=new Vector();
              DiskFileUpload upload=new DiskFileUpload();
              List items=upload.parseRequest(request);
              Iterator itr=items.iterator();
              while (itr.hasNext()){
                  FileItem item=(FileItem) itr.next();
                  String fieldName=item.getFieldName();
                  if (fieldName.equals(campo)){
                      File fullFile=new File(item.getName());
                      File savedFile=new File(local, fullFile.getName());
                      arquivoCriado = savedFile;
                      this.file=fullFile.getName();
                      item.write(savedFile);
                  } else {
                    params.addElement(fieldName);
                    params.addElement(item.getString());               
                  }
              }
              return true;
          } catch(Exception erro){
              System.err.println(FileUploadUtil.class.toString()+":"+erro.getMessage());
              erro.printStackTrace();
              return false;
          }
      }
      public File getArquivoCriado(){
          return this.arquivoCriado;
      }
        public String getFile(){
          return this.file;
      }
        public Vector getParams(){
          return this.params;
      }

        public void excluirArquivo() {
            arquivoCriado.delete();
        }
	
}